package com.nicewuerfel.blockown.database;
import com.google.common.base.Optional;
import com.nicewuerfel.blockown.Ownable;
import com.nicewuerfel.blockown.User;
import com.nicewuerfel.blockown.output.Output;
import java.io.File;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.RejectedExecutionException;
import javax.annotation.Nonnull;
public abstract class CachedDatabase extends Database {
final CacheAccessor cache;
CachedDatabase(Output output, File pluginFolder) {
super(output);
cache = new CacheAccessor(this, pluginFolder);
}
@Override
public Optional<User> getOwner(@Nonnull Ownable ownable) {
return cache.getOwner(ownable);
}
@Override
public void enqueue(DatabaseAction databaseAction) {
try {
getThreadPool().execute(new CachedDatabaseOperation(this, databaseAction));
} catch (RejectedExecutionException ignored) {
getOutput().printConsole("Couldn't execute DatabaseAction");
}
}
/**
* Flush cache data to database. Removes each flushed key-value-pair from the given {@link Map}.
*
* @param cacheData the cache data
* @return true, if successful
*/
boolean flushDatabase(@Nonnull final Map<Ownable, Optional<User>> cacheData) {
Iterator<Entry<Ownable, Optional<User>>> iterator = cacheData.entrySet().iterator();
Entry<Ownable, Optional<User>> owning;
while (iterator.hasNext()) {
owning = iterator.next();
DatabaseAction action;
Ownable key = owning.getKey();
Optional<User> value = owning.getValue();
if (!value.isPresent()) {
action = DatabaseAction.newUnownInstance(key);
} else {
action = DatabaseAction.newOwnInstance(key, value.get());
}
if (!setDatabaseOwner(action)) {
return false;
}
iterator.remove();
}
return true;
}
@Override
public void close() {
cache.close();
super.close();
}
}